#include "sh_vset.h"

static int32_t g_int32 = 0;
static char g_str[16] = {0};

/**
 * @brief 当参数值被设置后，回调函数会被调用。
 * 注意：仅当被设置的参数值发生变化时，回调函数才会被调用。
 */

static void _vset_cb_int32(sh_t *sh_hdl, void *new_value) { sh_echo(sh_hdl, "new value: %d\r\n", *(int32_t *)new_value); }
static void _vset_cb_str(sh_t *sh_hdl, void *new_value) { sh_echo(sh_hdl, "new str: %s\r\n", (char *)new_value); }

/**
 * @brief 对于枚举的类型，需要定义一个字符串，描述枚举的值。
 */

static char const s_enum_str[] = "enable=1, disable =  0, auto=3";

/**
 * @brief sh_vset_param_t 结构体用于实现选项+参数的格式。
 * 这个结构体通过 PSET_FN() 和 PSET_CP() 来执行具体的设置。
 */

static int _vset_int(const char *argv[]) { return SET_VAR_CB(&g_int32, -10, 10, _vset_cb_int32); }
static int _vset_str(const char *argv[]) { return SET_VAR_CB(&g_str, 0, 0, _vset_cb_str); }
static int _vset_enum(const char *argv[]) { return SET_ENUM_CB(&g_int32, s_enum_str, _vset_cb_int32); }

VSET_VAR(_ex1, &g_int32, -100, 100, _vset_cb_int32)                      // set demo ex1 <数值>
VSET_STR(_ex2, &g_str, _vset_cb_str)                                     // set demo ex2 <字符串>
VSET_ENUM(_ex3, &g_int32, "enable=1, disable=0, auto=3", _vset_cb_int32) // set demo ex3 <枚举>
VSET_OPTION(_ex4,                                                        // set demo ex4 [选项<值>] [选项<值>] ...
            {"--int32", "int32_t 类型的变量", _vset_int, NULL},
            {"--char", "char 类型的变量", _vset_str, NULL},
            {"--enum", "枚举类型的变量", _vset_enum, s_enum_str})

/**
 * @brief 子命令列表。在这个例子中的父命令是 'set demo <...>'
 */
SH_DEF_CMD(
    _register_sample,
    VSET_SETUP_CMD("ex1", "设置单个 数值 变量", _ex1),   // set demo ex1 <数值>
    VSET_SETUP_CMD("ex2", "设置单个 字符串 变量", _ex2), // set demo ex2 <字符串>
    VSET_SETUP_CMD("ex3", "设置单个 枚举 变量", _ex3),   // set demo ex3 <枚举>
    VSET_SETUP_CMD("ex4", "设置有多个选项的变量", _ex4), // set demo ex4 [选项<值>] [选项<值>] ...
);

void sample_vset(void)
{
    sh_register_cmd(&_register_sample);
}
